\documentclass[a4paper,oneside]{ctexart}

\usepackage{amsmath,amsthm}
\usepackage[hidelinks]{hyperref}
\usepackage{graphicx}
\usepackage{titlesec}
\usepackage[perpage,stable,side,flushmargin]{footmisc}
%\usepackage{verbatim}
\usepackage[xetex,hyperref]{xcolor}
\usepackage{listings}
%\usepackage{bm}
%\usepackage{fancyhdr}
\usepackage{lastpage}


%\usepackage[numbers,super,square,sort&compress]{natbib}
%\bibliographystyle{unsrt}

\renewcommand\figureautorefname{图}
\renewcommand\tableautorefname{表}

\renewcommand{\emph}[1]{\textbf{#1}}

\newcommand{\todo}{ \textcolor{blue}{TODO}}
\colorlet{BLUE}{blue}

\renewcommand{\marginparwidth}{70pt}

\begin{document}

\title{\zihao{2}\bfseries 日程系统功能的个人思考%
\footnote{文档主页：\url{http://code.google.com/p/lockeopiniongtd/}}}
\author{Locke\footnote{E-mail：\href{mailto:lockeh@qq.com}{lockeh@qq.com}}}

\maketitle




\clearpage

\tableofcontents

\clearpage


\input{sec1}

\input{sec2}

\input{sec3}

\input{sec4}



\section{私人日程的公开}

不管怎么说，孤立日程系统都是一种简化模型，完整日程系统解决方案必然要考虑协作问题。
本节讨论协作的初级阶段——日程公开。


\subsection{隐私}

本文讨论的日程系统是涵盖用户生活方方面面的日程系统，
一切不该放在记忆中的细碎事项都能够被丢入该日程系统中，这是本文讨论日程协作的大前提。

那么这样的日程系统就有了一个问题：它不可能被完整的公开，除非用户是一个隐私暴露狂。

\subsubsection{权限}

不光要考虑有些内容不能被公开，对于哪些内容可以对哪些人公开也是必须要考虑的，
老婆、老板、朋友等不同的人该看到的日程项肯定是不同的。

解决这个问题的方式就是给每人准备一个入口，给每个人显示该给他看的事项。
当然，由用户手工安排谁能看到哪些事项，这些事项分别占用了哪块时间等等是不现实的，
这应该是由日程系统安排，由用户给出必要的信息和限制。


\subsection{公开的只是真实日程的一个很好的近似}

\subsubsection{隐私带来的问题}
隐私问题影响了日程公开的方方面面，我们首先遇到的问题是：
对于一个不该显示在公开日程上的隐私事件，我们应该在公开日程上对应的时间区域内显示些什么。

显示为空闲是不行的，隐私的事件也可能有很高的优先级，或者是不可更改的，
如果别人申请在这个时间段内安排一个预约，这个事情会很麻烦。

显示为灰色隐私事项不可见也是不行的，原因有两点：
\begin{enumerate}
\item
有时候我们不希望公开某个隐私事项占用了某段时间，例如在上班的时间干私事。

\item
人是有好奇心的，你告诉别人这里有隐私，其实是激起了别人探查你隐私的兴趣。
\end{enumerate}

那么唯一的选择就是撒谎，即显示一个看似合理的事件。既然撒了一个谎，
那也再多撒些也无妨，我们可以直接告诉观察者这只是一个可能的安排，
一般的人不会在意这种细节，只是想大概了解下你的日程状态。
真的想要探查你隐私的人才会刨根问底，而这正是我们想要控制的。

当观察者想要建立一个新预约时，确实需要知道具体的可用时间，
如果仅仅通过可用时间来进行那对日程公开带来的限制就太多了。
更重要的问题是优先级的存在，即高优先级的任务可以抢占低优先级的任务的时间，
而优先级也应该被看作隐私，虽然在有些时候仍然需要公开部分的优先级。
所以后面讲引入专门的自助预约系统来解决这个问题。

\subsubsection{表面日程和实际日程的分离}

显示的这个虚假的日程在这里称作表面日程，对于每一个观察者都有专为他准备的一个表面日程。
而只有用户可见的真实日程在这里称作实际日程。

需要说明的是，引入表面日程不光是从隐私的角度考虑的，也是在为观察者过滤掉不必要的细节。
将来日程系统控制的时间粒度可能会更小，例如5分钟，用户可以引入诸如番茄时间等等工作方式，
这时连短暂的休息、喝水、上厕所、打电话等事项都会被纳入日程系统，
观察者肯定对此不感兴趣，上级只要知道你什么时候能做完工作，老婆知道你哪天需要加班，
同事知道你什么时候有空。具体这一下午你有哪些时间是在上厕所、看报纸、叨扰别人还是在发呆真的不重要。

表面日程不光可以过滤琐事，也可以为观察者提供一个简化的日程，
因为一般上级不会关心你的家事到底是什么，你老婆也不会关心你今天上班忙的到底是任务A还是任务B。

表面日程也可以隐藏任务的完成细节。很多时候交给你任务的人并不关心你把这个任务分成多少步来做，
只是想知道你什么时候能做完，以及当前进度如何。这样我们就可以在实际日程中设置很多阶段，
私人Deadline等等，在表面日程上只显示一个整体任务和当前进度。

表面日程还为私人的缓冲时间提供了可能，很多任务你可以估计平均时间，最坏情况需要的时间，
但老板对此并不关心，他需要的是一个明确的完成时间，时间余量是要自己留的，
虽然有些老板明白缓冲时间的重要性，但并不是所有人都如此，所以我们公开的进度和预计时间和
实际在日程系统中安排的事件是有差别的，这个差别就由表面日程来掩盖。


\subsubsection{表面日程的内容}

对于一个特定的观察者，他可见的所有预约都应该被真实地安排在表面日程上，
因为他知道这个预约的所有情况，不应该在这方面造假。所以我们在公开一个预约的情况时，
应该最小化该可见该预约的人，以便系统可以顺利地自动安排表面日程。

然后是这个观察者所有可见的任务，有些任务可能经过拉长（例如包含缓冲时间），
有些可能是一大类任务的总称（如锻炼身体、学习充电、家事、工作、休闲娱乐等），
还有些可能是虚假的任务（伪造的任务，用于占据时间，就不举例了）。
这些任务可以不安排在日程表上，以一种任务列表的形式显示在边上，只在日程表上标上被占用的时间，
也可以显示一个可能的日程安排方式。

也可以显示占用某块时间的任务的优先级，但由于隐私的存在，这方面必须要慎重考虑，
特别是在隐私任务中一个任务高于所有表面任务的时候。

日程冲突也是比较麻烦的事情，如果是两个观察者可见的事件冲突了，那直接显示即可。
如果是两个不可见的事件冲突了，这根本和这个观察者没关系。
问题在于如果一个可见的任务和一个不可见的任务在实际日程中冲突了，那该如何处理呢？
只能在实际日程中显示冲突，由用户自己解决（重新安排实际日程）。
如果是在表面日程中冲突呢？这似乎不太重要，因为他们实际并没有冲突，
只是会给观察者带来不悦，而且这可能是由用户故意制造的（伪造忙碌的假象）。

\subsubsection{表面日程的真实性}

表面日程的意义在于它的近似性，所以我们应该近似到什么程度就是需要考虑的问题。
传统的观点是：
\begin{enumerate}
\item
任务进度可以缓报，但不能虚报。

\item
空闲时间应该尽量真实，因为这方面的作假很容易被揭穿。

\item
完成任务所需要的时间是作假的最主要方式。不光因为缓冲时间，
难道老板平常给你安排任务时设的时间就没包括你打酱油的时间？
\end{enumerate}

当然表面日程不应该有矛盾，应该满足各任务自身的时间、资源限制等。

任务的优先级可以考虑显示一个针对该观察者的特殊优先级，该优先级和后面的自助预约添加功能应该自洽，
即高优先级任务可以抢占低优先级任务，高优先级预约可以选择性地抢占低优先级预约。

\subsection{自动任务安排}

前面已经提到，这种多表面日程的更新不应该完全由用户手工指定，
因为这对于自己的生产力完全没有提高，应该由日程系统自动安排，
当安排的不够好的时候才需要用户进行调整。

而对于某个待表面日程来说，系统最初只知道有那些任务应该被安排在上面，
但除了预约是固定的以外，其他的任务是不确定的，而且用户一般也没兴趣具体安排这些虚假的日程，
所以系统必须要能够自动安排出一个看似合理的日程。
值得一提的是，这个看似合理的日程也可能很复杂，
例如某个实际任务要求每次分片都不能短于1小时。

这就需要前面孤立日程系统的自动日程安排功能，而且对它产生的日程质量并不高，
因为和毕竟是虚假的日程。
不过日程公开的虚假日程自动安排还需要处理下面提到的一些新问题。

\subsubsection{缓冲和表面长度系数}

前面已经提到，缓冲是非常重要的，特别是显示给观察者的时候。
但一个任务的表面长度不可能被无限拉长，一般来说拉长的比例是相对固定的。
那么按照这个比例，就可以自动产生一个表面长度，而且这个表面长度可以是弹性的。
这个比例就称作表面长度系数，这个系数一般是大于1的，当然也可以被指定为小于1。
不管怎么样，表面长度系数只是产生一个默认表面长度，当用户想要详细指定表面长度时，
他可以明确指定表面长度，乃至表面长度的弹性范围。



\subsubsection{伪手工更新原则}

前面已经提到，表面日程是虚假的，而且可能很容易出现不自洽的情况，
为了解决这个问题，这里提出一种表面日程的更新原则，即伪手工更新原则。
表面日程是自动产生的，日程系统完全可以做到实时更新表面日程，
但我们强制设置一个刷新频率（而且是有波动的），表面日程只按照这个刷新频率更新。
也就是说，表面日程实际是自动更新的，但我们把它伪装成手工更新的。

它的好处在于，观察者看到的永远是一个“过时的”表面日程，
因为他查看表面日程的时候，一般距表面日程的更新已经过了一段时间。
那么这个表面日程和真实日程就“理所应当”有所差别，
因为现实是不断变化的嘛，这可以抵消一部分表面日程和实际日程的不吻合，
当然这只是最后的借口。而且对于一般人来讲，“更新日程系统是个比较麻烦的事情，
所以一天才更新一次”是可以接受的。

而且你还可以故意把更新时间设置在观察者的非工作时间上，如下班的时间，
这样当观察者查看时，永远不会看到一个准确的表面日程。

当然如果你和某个观察者特别亲密，完全可以关闭伪手工更新方式，
保持表面日程实时更新。



\subsection{自助预约}

自助预约是指非本日程系统的用户向日程系统的用户发出预约，
由于表面日程隐藏了很多信息，所以观察者单凭观察表面日程并不能很好地完成预约，
所以日程公开需要提供一个自助预约方式，由观察者输入预约的内容、可选时间、优先级等信息，
由日程系统给出建议时间，或告知观察者，该预约会和该用户的其他预约发生冲突。

自助预约功能只是在实现完整日程协作前的临时解决方案，
同时也是针对非日程系统用户观察者的。

这方面具体还有哪些问题尚不清楚。




\section{日程系统的设计\todo}
\subsection{UI设计\todo}
\subsubsection{事件属性的显示}

随着日程系统中事件可设定的属性越来越多，这些属性应该如何在界面上显示就成了一个不小的问题，
考虑到“最近事件列表”是用户最常使用的功能，在这方面太随意肯定是会吃亏的。

事件的属性虽然很多，但一般来讲大部分都是空的，像传统那样弄个所有属性列表绝对是吃力不讨好的行为。
对于复杂属性的显示，展开式的显示方式已经是大趋势了，像QQ的好友列表那样，只对于当前用户选择的项，
才显示它的详细信息，而处于折叠状态的项则只显示最基本的信息（往往要视UI界面的宽度而定）。

但在这种情况下，事件的属性可能还是太多，而且仍然有空属性的问题。
我的建议是，使用属性分级自动布局的方式，即对于每个事件，空白的属性默认不显示，
用户把该事件的非空白属性分为两类：显示或不显示（或者三类：重要，普通，不显示）。
每类属性集中显示，同类属性的排布方式由程序根据当前界面宽度和属性内容自动排布。

在设置属性时，界面应该是类似所见即所得的\footnote{由于同类属性在实际显示时会由程序自动安排，
所以不是完全所见即所得。}，即在用户添加或修改任务信息的时候，显示一个实际显示效果，
在上面用户可以通过拖放属性来改变其分类。

这种方式有几点优势：1、用户可以单独设置每个事件的属性的显示策略，屏蔽过于细节的内容。
2、显示布局是由程序自动生成的，可以自动适应用户界面的大小，特别是在手持设备上。
3、显示详细信息的时候，也可以采用多级的方式，用户每次可以通过“显示更多”来查看更多的信息。
4、可以通过记录用户查看单个事件各级信息频率来优化该事件下次的显示方式。

\subsection{DRY原则\todo}
\subsection{情况是在持续变化的\todo}
\subsection{不能随意丢弃事件\todo}
\subsection{比用户做的更好\todo}
\subsection{用户的教育过程是不能无视的\todo}
\subsection{孤立日程系统也有隐私问题}

前面已经说过，孤立日程系统是给单个用户使用的，但没说该日程系统只是对一个用户可见的，
更一般地说，日程系统的UI往往会被其他人看到。所以某些私人是事件在非必要时应该可以设置成隐藏，
或不直接显示。

\subsection{日程系统应该是随时随地的\todo}
\subsection{回顾与历史数据分析\todo}


\section{时间粒度为5分钟的日程系统\todo}
\label{sec:function-3rd-detail-schedule}
\subsection{任务分割\todo}
\label{sec:detail-schedule.task-partition}
\subsection{休息时间的安排\todo}



\section{日程系统的协作\todo}
\subsection{隐私、联系人和权限\todo}
\subsection{预约\todo}
\subsubsection{预约发起\todo}
\subsubsection{预约自动安排\todo}

\section{个人知识辅助系统\todo}
\subsection{学习辅助系统\todo}
\subsection{知识管理系统\todo}
\subsubsection{缺乏的基础\todo}

\end{document}
